package com.vaadin.tutorial.crm.security.authentication;

import com.vaadin.tutorial.crm.ui.view.login.LoginView;
import com.vaadin.flow.component.UI;
import com.vaadin.flow.router.BeforeEnterEvent;
import com.vaadin.flow.server.ServiceInitEvent;
import com.vaadin.flow.server.VaadinServiceInitListener;
import org.springframework.stereotype.Component;
/**
 * Spring Security基于路径限制对内容的访问。
 * Vaadin应用程序是单页应用程序。这意味着，当您在视图之间导航时，即使路径发生变化，它们也不会触发完整的浏览器刷新。
 * 为了保护Vaadin应用程序，我们需要将Spring Security连接到Vaadin导航界面。
 * @Author: fan
 * @DateTime: 2021-01-15 11:17
 **/
@Component
public class ConfigureUIServiceInitListener implements VaadinServiceInitListener {

    //监听UI的初始化(Vaadin中的内部根组件)，然后在每次视图转换之前添加一个监听器
    @Override
    public void serviceInit(ServiceInitEvent event) {
        event.getSource().addUIInitListener(uiEvent -> {
            final UI ui = uiEvent.getUI();
            ui.addBeforeEnterListener(this::authenticateNavigation);
        });
    }

    //如果用户没有登录，我们将所有请求重新路由到登录
    private void authenticateNavigation(BeforeEnterEvent event) {
        if (!LoginView.class.equals(event.getNavigationTarget())
                && !SecurityUtils.isUserLoggedIn()) {
            event.rerouteTo(LoginView.class);
        }
    }
}
